// 小程序网络请求工具
const BASE_URL = 'http://localhost:9090'  // 后端服务地址

// 获取token的方法
const getToken = () => {
  // 优先从全局数据获取
  const app = getApp()
  if (app && app.globalData && app.globalData.userInfo && app.globalData.userInfo.token) {
    console.log('从全局数据获取token')
    return app.globalData.userInfo.token
  }

  // 从本地存储获取
  const userInfo = wx.getStorageSync('userInfo')
  if (userInfo && userInfo.token) {
    console.log('从本地存储获取token')
    return userInfo.token
  }

  // 兼容旧版本的token存储方式
  const oldToken = wx.getStorageSync('token')
  if (oldToken) {
    console.log('从旧版本存储获取token')
    return oldToken
  }

  console.log('未找到有效token')
  return ''
}

// 处理token过期的方法
const handleTokenExpired = (errorData) => {
  console.log('Token过期，清理登录状态')

  // 清理全局状态
  const app = getApp()
  if (app) {
    app.globalData.userInfo = null
    app.globalData.isLogin = false
  }

  // 清理本地存储
  wx.removeStorageSync('userInfo')
  wx.removeStorageSync('token')

  // 显示提示
  wx.showToast({
    title: errorData.msg || '登录已过期，请重新登录',
    icon: 'none',
    duration: 2000
  })

  // 延迟跳转，避免频繁跳转
  setTimeout(() => {
    wx.navigateTo({
      url: '/pages/login/login'
    })
  }, 1000)
}

// 请求方法封装
const request = (options) => {
  return new Promise((resolve, reject) => {
    const token = getToken()

    // 添加请求日志
    console.log(`发起请求: ${options.method || 'GET'} ${BASE_URL + options.url}`)
    console.log('请求参数:', options.data)
    console.log('Token长度:', token ? token.length : 0)

    wx.request({
      url: BASE_URL + options.url,
      method: options.method || 'GET',
      data: options.data,
      header: {
        'Content-Type': 'application/json;charset=utf-8',
        'token': token
      },
      success: (res) => {
        console.log(`请求响应: ${options.url}`, res.data)

        if (res.statusCode === 200) {
          // 处理业务状态码
          if (res.data.code === '401') {
            console.error('Token验证失败:', res.data)
            // 未登录或token过期
            handleTokenExpired(res.data)
            reject(res.data)
          } else {
            resolve(res.data)
          }
        } else {
          console.error('HTTP请求失败:', res)
          wx.showToast({
            title: '请求失败',
            icon: 'none'
          })
          reject(res)
        }
      },
      fail: (err) => {
        console.error('网络请求异常:', err)
        wx.showToast({
          title: '网络异常',
          icon: 'none'
        })
        reject(err)
      }
    })
  })
}

// 文件上传方法
const upload = (filePath, name = 'file') => {
  return new Promise((resolve, reject) => {
    const token = getToken()

    console.log(`发起文件上传: ${BASE_URL}/files/upload`)
    console.log('文件路径:', filePath)
    console.log('参数名:', name)
    console.log('Token长度:', token ? token.length : 0)

    wx.uploadFile({
      url: BASE_URL + '/files/upload',
      filePath: filePath,
      name: name,
      header: {
        'token': token
      },
      success: (res) => {
        console.log('文件上传响应状态码:', res.statusCode)
        console.log('文件上传响应数据:', res.data)

        if (res.statusCode === 200) {
          try {
            const data = JSON.parse(res.data)
            console.log('解析后的响应数据:', data)

            // 处理业务状态码
            if (data.code === '401') {
              console.error('Token验证失败:', data)
              handleTokenExpired(data)
              reject(data)
            } else if (data.code === '200') {
              // 上传成功
              console.log('文件上传成功，返回URL:', data.data)
              resolve(data)
            } else {
              // 其他错误
              console.error('文件上传业务失败:', data)
              wx.showToast({
                title: data.msg || '上传失败',
                icon: 'none'
              })
              reject(data)
            }
          } catch (err) {
            console.error('响应数据解析失败:', err)
            console.error('原始响应数据:', res.data)
            reject({ message: '响应数据解析失败', originalData: res.data })
          }
        } else {
          console.error('文件上传HTTP请求失败，状态码:', res.statusCode)
          console.error('错误响应:', res)

          let errorMsg = '上传失败'
          if (res.statusCode === 413) {
            errorMsg = '图片文件过大，请选择较小的图片'
          } else if (res.statusCode === 404) {
            errorMsg = '上传服务不可用'
          } else if (res.statusCode === 500) {
            errorMsg = '服务器内部错误'
          }

          wx.showToast({
            title: errorMsg,
            icon: 'none',
            duration: 3000
          })
          reject(res)
        }
      },
      fail: (err) => {
        console.error('文件上传网络异常:', err)
        wx.showToast({
          title: '网络异常，上传失败',
          icon: 'none'
        })
        reject(err)
      }
    })
  })
}

// 导出请求方法
module.exports = {
  request,
  upload,
  get: (url, data) => request({ url, method: 'GET', data }),
  post: (url, data) => request({ url, method: 'POST', data }),
  put: (url, data) => request({ url, method: 'PUT', data }),
  delete: (url, data) => request({ url, method: 'DELETE', data }),
  del: (url, data) => request({ url, method: 'DELETE', data })
}
